package server.console;

import java.util.ArrayList;

import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.Parser;

import server.exception.InterpreterException;

public class MensajeInterpreter implements Interprete {
	public static final String ARG_MENSAJE = "mensaje";
	public static final String ARG_USUARIO = "usuarios";
	
	private Options options;
	private Parser parser;
	

	public MensajeInterpreter() {
		parser = new BasicParser();
		// /////////////////////////////////////////////////////////////////////
		// Fase 1: Configuramos las opciones de validación de entrada.
		// /////////////////////////////////////////////////////////////////////
		options = new Options();
		options.addOption("u", MensajeInterpreter.ARG_USUARIO, true, "Usuarios a los que se desea enviar el mensaje separados por espacio");
		options.addOption("m", MensajeInterpreter.ARG_MENSAJE, true, "Mensaje a enviar a los usuarios");
		options.addOption("h", "help", false, "Imprime este mensaje de ayuda");
	}

	@Override
	public int interpretar(Orden comando) throws InterpreterException {
		ArrayList<String> usernames = new ArrayList<String>();
		String mensaje;
		
		if (!"mensaje".equalsIgnoreCase(comando.getNombre()))
			return Interprete.NO_RECONOCIDO;

		// /////////////////////////////////////////////////////////////////////
		// Fase 2: Parseamos la entrada con la configuración establecida
		// /////////////////////////////////////////////////////////////////////
		try {
			String args[] = new String[comando.getArgumentos().size()];
			comando.getArgumentos().toArray(args);
			CommandLine cmdLine = this.parser.parse(this.options, args);
			
			// AYUDA
			if (cmdLine.hasOption("h"))
				return mostrarAyuda();
			
            // Usuarios
            if (cmdLine.hasOption("u")){
            	for(String usuario : cmdLine.getOptionValue('u').split(" "))
            		usernames.add(usuario);
            } else {  
            	return mostrarAyuda();
            }
            
            // Mensaje             
            if (cmdLine.hasOption("m")){  
            	mensaje = cmdLine.getOptionValue('m');
            } else {  
            	return mostrarAyuda();
            }
            
            // FIXME Enviar mensajes a usuarios cuando este implementado
            for (String usuario : usernames)
            	System.out.println(usuario +" <- "+ mensaje);
            
		} catch (ParseException e) {
			mostrarAyuda();
			new InterpreterException("Error en el parseo de los argumentos: "
					+ comando.getArgumentos(), e);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return EXITO;
	}

	@Override
	public String getTooltip(String s) {
		if ("servicio".equals(s.toLowerCase()))
			return "Maneja el servicio de chat";
		else
			return null;
	}
	
	private int mostrarAyuda() {
		new HelpFormatter().printHelp("mensaje" , options);
		return Interprete.EXITO;
	}

}
